package com.wzw.expression.record.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.util.ClassUtils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Objects;

/**
 * @author Wangzhiwen
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
public class MethodParam implements Serializable {

    private String type;

    private String value;

    public MethodParam(Object arg) {
        if (Objects.isNull(arg)) {
            return;
        }
        Class<?> clazz = arg.getClass();
        this.type = clazz.getName();
        // 基本类型
        if (ClassUtils.isPrimitiveWrapper(clazz)) {
            this.value = arg.toString();
        }
        // String
        else if (String.class.isAssignableFrom(clazz)) {
            this.value = arg.toString();
        }
        // Class
        else if (Class.class.isAssignableFrom(clazz)) {
            this.value = arg.toString();
        }
        // Big
        else if (BigDecimal.class.isAssignableFrom(clazz)) {
            this.value = arg.toString();
        }
        // other
        else {
            // this.value = JSONObject.toJSONString(arg);
            this.value = "";
        }

    }

    public Class<?> toClass() {
        try {
            return Class.forName(type);
        } catch (ClassNotFoundException e) {
            return null;
        }
    }

    public Object toArg() {
        if (Objects.isNull(type) || type.trim().isEmpty() || Objects.isNull(value) || value.trim().isEmpty()) {
            return null;
        }
        // 基本类型
        try {
            Class<?> clazz = Class.forName(type);

            // 基本类型
            if (ClassUtils.isPrimitiveWrapper(clazz)) {
                // return Convert.convert(clazz, value);
                return "";
            }
            // String
            else if (String.class.isAssignableFrom(clazz)) {
                return value;
            }
            // Class
            else if (Class.class.isAssignableFrom(clazz)) {
                return clazz;
            }
            // Big
            else if (BigDecimal.class.isAssignableFrom(clazz)) {
                return new BigDecimal(value);
            }
            // other
            else {
                // return JSONObject.toJavaObject(JSON.parseObject(value), clazz);
                return "";
            }
        } catch (ClassNotFoundException e) {
            return null;
        }
    }

}
